package org.muyu;

import org.muyu.component.AbstractMessage;
import org.muyu.component.CommonMessage;
import org.muyu.component.SpecialUrgencyMessage;
import org.muyu.component.MessageImplementor;
import org.muyu.component.MessageMobile;
import org.muyu.component.MessageSMS;
import org.muyu.component.UrgencyMessage;

/**
 * 结构型模式 => 桥接模式
 *
 * 组成部件
 * 1. 抽象部分的接口【Abstraction】 => AbstractMessage一个抽象的消息，定义了消息应该持有一个发送的方式，和发送方法
 * 2. 扩展抽象部分的接口【RefinedAbstraction】 => CommonMessage普通消息、UrgencyMessage紧急消息、SpecialUrgencyMessage特急消息都是AbstractMessage的子类
 * 3. 定义实现部分的接口【Implementor】 => MessageImplementor短信发送方式的接口，即短信是如何被发送的
 * 4. 真正实现Implementor接口的对象【ConcreteImplementor】 => MessageMobile手机发送、MessageSMS站内信发送、MessageEmail邮件发送
 *
 * 将抽象部分与它的实现部分分离，使它们都可以独立地变化
 *
 * 案例理解
 * 1. 本案例将短信抽象出来和发送方式进行了分离，可以根据不同的发送方式，发送不同的消息
 * 2. AbstractMessage作为抽象部分，通过持有不同的发送方式，实现不同的发送方法
 * 3. CommonMessage、UrgencyMessage、SpecialUrgencyMessage作为扩展抽象部分，通过super.sendMessage()来调用父类所持有的发送方式
 * 4. MessageImplementor作为实现部分，定义了短信发送方式的接口
 * 5. MessageMobile、MessageSMS、MessageEmail作为真正实现Implementor接口的对象，实现在基础功能上的拓展
 * 6. 在最终使用时，我们通过父类引用持有子类对象的方式，就可以实现短信发送方式的灵活切换
 *
 */
public class Client {
    public static void main(String[] args) {
        //创建具体的实现对象
        MessageImplementor impl = new MessageSMS();

        //创建一个普通消息对象
        AbstractMessage m = new CommonMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");
        //创建一个紧急消息对象
        m = new UrgencyMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");
        //创建一个特急消息对象
        m = new SpecialUrgencyMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");

        //把实现方式切换成手机短消息，然后再实现一遍
        impl = new MessageMobile();
        m = new CommonMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");
        m = new UrgencyMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");
        m = new SpecialUrgencyMessage(impl);
        m.sendMessage("请喝一杯茶", "小李");
    }
}
